package com.checknull.druineage.element;

import com.alibaba.druid.util.StringUtils;
import com.checknull.druineage.customizable.UsedForCal;

import java.util.ArrayList;
import java.util.List;

public class Schema {

    /**
     * 所属数据库（解析批次）
     */
    private DB owner;

    /**
     * schema名
     */
    private String name;

    /**
     * 表
     */
    private List<Table> tables = new ArrayList<>();

    public DB getOwner() {
        return owner;
    }

    public void setOwner(DB owner) {
        this.owner = owner;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Table> getTables() {
        return tables;
    }

    /**
     * 合并并返回表
     *
     * @param table 表
     * @return 正确的表
     * @description 将传入的表与现有的表集合进行比较，若已存在相同的，则使用现有的表
     * 若不存在，则添加进表集合，整理完之后再返回正确的表
     */
    public Table absorbTable(Table table) {
        if (StringUtils.isEmpty(table.getName())) {
            return null;
        }
        for (Table tb : tables) {
            if (table.getName().equalsIgnoreCase(tb.getName())) {
                return tb.absorb(table);
            }
        }
        tables.add(table);
        table.setOwner(this);
        return table;
    }

    /**
     * schema吸收
     *
     * @param schema 被吸收schema
     * @return 吸收完成后的schema
     * @description 吸收并不覆盖，优先保留自有的。吸收内容：传入schema的所有表
     */
    public Schema absorb(Schema schema) {
        for (Table table : schema.getTables()) {
            Table thisTable = absorbTable(table);
            if (!table.equals(thisTable)) {
                thisTable.absorb(table);
            }
        }
        return this;
    }

    /**
     * 清除表中的所有常量字段
     */
    public void clearValColumn() {
        for (Table table : tables) {
            table.clearValColumn();
        }
    }

    /**
     * 清理临时表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearTempTable(UsedForCal usedForCal) {
        for (Table table : tables) {
            table.clearTempTable(usedForCal);
        }
        tables.removeIf(Table::isTemp);
    }

    /**
     * 清理删除表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearDropTable(UsedForCal usedForCal) {
        for (Table table : tables) {
            table.clearDropTable(usedForCal);
        }
        tables.removeIf(Table::isTemp);
    }

    /**
     * 清理中间表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearMidTable(UsedForCal usedForCal) {
        for (Table table : tables) {
            table.clearMidTable(usedForCal);
        }
        tables.removeIf(Table::isTemp);
    }

    @Override
    public String toString() {
        return StringUtils.isEmpty(name) ? super.toString() : name;
    }

}
